package com.ok.common.utils

import android.text.Editable
import android.text.TextWatcher
import android.view.View
import android.widget.TextView

/**
 * 自定义 TextWatcherHelper 实现 TextWatcher
 */
class TextWatcherUtils : TextWatcher {

    /**
     * 存放 需要监听的 EditText 或者 TextView （EditText 继承于 TextView）
     */
    private val editViewList = arrayListOf<TextView>()

    /**
     * 需要 监听 多个 editText 实现某些效果的view （举个栗子 ，比如 Button 在所有 EditText 为非空内容 才可点击。。。）
     */
    private var mainView: View? = null

    /**
     * 设置 目标 View 同上
     */
    fun setTargetView(mainView: View?): TextWatcherUtils {
        this.mainView = mainView
        return this
    }

    /**
     * 设置需要监听的 EditText 或 TextView
     */
    fun addEditTexts(vararg editViews: TextView) {
        if (editViews.isNullOrEmpty())
            return

        for (editText in editViews) {
            editText.addTextChangedListener(this)
            editViewList.add(editText)
        }

        afterTextChanged(null)
    }

    /**
     * 移除所有监听 防止出现问题
     */
    fun removeAllViews() {
        if (editViewList.isEmpty())
            return

        for (editText in editViewList) {
            editText.removeTextChangedListener(this)
        }

        editViewList.clear()
    }

    /**
     * 设置是否可点击 或者 你们想要的效果 自定义
     */
    private fun setEnabled(enabled: Boolean) {
        if (enabled == mainView?.isEnabled)
            return

        mainView?.isEnabled = enabled

    }

    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
    }

    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
    }

    /**
     * 遍历 所有缓存的 EditText 或 TextView 检查 对应的条件是否满足
     *
     * 这边为了区别需要特殊条件的 EditText 所以 设置了 tag
     */
    override fun afterTextChanged(s: Editable?) {
        if (editViewList.isEmpty())
            return

        for (editText in editViewList) {
            val text = editText.text?.toString()?.trim()
            if (text.isNullOrEmpty()) {
                setEnabled(false)
                return
            }

            if (editText.tag == "sms_code") {
                val i = s?.length?.compareTo(4) ?: -1
                if (i < 0) {
                    setEnabled(false)
                    return
                }
            }
        }

        setEnabled(true)
    }
}